/*
    SUSAN® - Sole of Unix Save ANything

   Copyright (C) 2020-2020 Hechzh Property

   
*/

#ifndef BAREOS_SRC_DIRD_DBCOPY_DATABASE_COLUMN_DESCRIPTIONS_H_
#define BAREOS_SRC_DIRD_DBCOPY_DATABASE_COLUMN_DESCRIPTIONS_H_

#include "include/bareos.h"
#include "dird/dbcopy/column_description.h"
#include "cats/cats.h"

#include <string>

class BareosDb;

class DatabaseColumnDescriptions {
 public:
  DatabaseColumnDescriptions(BareosDb* db) : db_{db} {};
  virtual ~DatabaseColumnDescriptions() = default;
  void AddToMap(const char* column_name_in,
                const char* data_type_in,
                const char* max_length_in);

  using ColumnDescriptions = std::map<std::string, ColumnDescription>;

  ColumnDescriptions column_descriptions;

 protected:
  enum RowIndex : int
  {
    kColumnName = 0,
    kDataType = 1,
    kCharMaxLenght = 2
  };
  void SelectColumnDescriptionsAndAddToMap(const std::string& sql_query);

 private:
  BareosDb* db_{};
  static int ResultHandler_(void* ctx, int fields, char** row);
};

class DatabaseColumnDescriptionsPostgresql : public DatabaseColumnDescriptions {
 public:
  DatabaseColumnDescriptionsPostgresql(BareosDb* db,
                                       const std::string& table_name);
};

class DatabaseColumnDescriptionsMysql : public DatabaseColumnDescriptions {
 public:
  DatabaseColumnDescriptionsMysql(BareosDb* db, const std::string& table_name);
};

#endif  // BAREOS_SRC_DIRD_DBCOPY_DATABASE_COLUMN_DESCRIPTIONS_H_
